package com.mhy.timetrace;

import android.util.Log;
import android.view.View;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

/**
 * @author mahongyin 2020-04-17 9:56 @CopyRight mhy.work@qq.com
 * @description: .所有控件的点击事件，打印控件的名称
 *
 * 相当于监听View.OnClickListener.onClick(..)调用
 *
 * -@Around：是advice，也就是具体的插入点。@Around该方法的逻辑会包含切入点前后，
 * 如果用到该注解，记得自己需要控制切入点的执行逻辑，调用joinPoint.proceed()。
 * 如果使用@Before注解，表示的是在切入点之前执行，@After表示在切入点之后执行，
 * 此时不需要调用joinPoint.proceed()。
 * execution：处理JPoint的类型，例如call、execution。
 * 对于execution(* android.view.View.OnClickListener.onClick(..))，
 * 第一个 * 所处的位置表示的是返回值，* 是通配符，表示的是任意类型。
 * android.view.View.OnClickListener.onClick(..)
 * 表示的执行OnClickListener的onClick()方法。
 * onClick(..)中的.. 表示任意类型、任意个数的参数。
 * onClickMethodAround：表示的实际切入代码。这个方法名可以自己随意定义。
 */
@Aspect
public class ClickAspect {
    private static final String TAG = "ClickAspect";
    // 第一个*所在的位置表示的是返回值，*表示的是任意的返回值，
    // onClick()中的 .. 所在位置是方法参数的位置，.. 表示的是任意类型、任意个数的参数
    // * 表示的是通配  execution是执行的地方 call是调用的地方
    @Pointcut("execution(* android.view.View.OnClickListener.onClick(..))")
    public void clickMethod() {}

    @Around("clickMethod()")
    public void onClickMethodAround(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        View view = null;
        for (Object arg : args) {
            if (arg instanceof View) {
                view = (View) arg;
            }
        }
        //获取View 的 string id
        String resEntryName = null;
        String resName = null;
        if (view != null) {
            // resEntryName: btn_activity_2  resName: com.sososeen09.aop_tech:id/btn_activity_2
            resEntryName = view.getContext().getResources().getResourceEntryName(view.getId());
            resName = view.getContext().getResources().getResourceName(view.getId());
        }
        joinPoint.proceed();
        Log.d(TAG,"after onclick: " + "resEntryName: " + resEntryName + "  resName: " + resName);
    }
}